﻿//
// Copyright (c) 2024 BPer
//
#include <bperrtp/BPerRtcpRpsi.h>
#include <bperrtp/BPerRtpConstant.h>
#include <bperutil/sys/BPerLog.h>

void bPer_create_rtcpRpsi(BPerRtcpCommon* comm){
	if(comm==NULL) return;
	if(comm->rpsi==NULL) comm->rpsi=(BPerRtcpRpsi*)bPer_malloc(sizeof(BPerRtcpRpsi));
	 	comm->rpsi->pb = 0;
	    comm->rpsi->payload_type = 0;
	    comm->rpsi->native_rpsi = NULL;
	    comm->rpsi->nb_native_rpsi = 0;

	    comm->header.padding = 0;
	    comm->header.type = BPerRtcpType_psfb;
	    comm->header.rc = kRPSI;
	    comm->header.version = kRtcpVersion;
	    comm->ssrc = 0;
}
void bPer_destroy_rtcpRpsi(BPerRtcpCommon* comm){
	if(comm==NULL) return;
	bPer_free(comm->rpsi);
}
int32_t bPer_decode_rtcpRpsi(BPerRtcpCommon* comm,BPerBuffer *buffer){
	if(comm==NULL||buffer==NULL) return 1;
	/*
	    @doc: https://tools.ietf.org/html/rfc4585#section-6.1
	        0                   1                   2                   3
	    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |V=2|P|   FMT   |       PT      |          length               |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |                  SSRC of packet sender                        |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |                  SSRC of media source                         |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   :            Feedback Control Information (FCI)                 :
	   :                                                               :


	    @doc: https://tools.ietf.org/html/rfc4585#section-6.3.3
	    0                   1                   2                   3
	    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |      PB       |0| Payload Type|    Native RPSI bit string     |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   |   defined per codec          ...                | Padding (0) |
	   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	   */

	    int32_t err = BPer_Ok;
	    comm->data = buffer->head;
	    comm->nb_data = bPer_buffer_left(buffer);

	    if(BPer_Ok != (err = bPer_decode_header_rtcpCommon(comm,buffer))) {
	        return bPer_error_wrap(err, "decode header");
	    }

        comm->rpsi->mediaSsrc = bPer_read_4bytes(buffer);
	    int32_t len = (comm->header.length + 1) * 4 - 12;
	    bPer_buffer_skip(buffer,len);
	    return err;
}
int32_t bPer_encode_rtcpRpsi(BPerRtcpCommon* comm,BPerBuffer *buffer){
	int32_t err = BPer_Ok;

	    return err;
}
uint64_t bPer_rtcpRpsi_nb_bytes(){
	return kRtcpPacketSize;
}

